import time


# 函数运行 2秒
def func():
    time.sleep(2)


start_time = time.time()
func()
end_time = time.time()
print('函数运行时间为：%.2fs' % (end_time - start_time))


###################装饰器的介绍使用######################
# 装饰器就是接受一个函数为参数返回另一个函数的函数
def timeit(func):
    def result():
        start_time = time.time()
        func()
        end_time = time.time()
        print('函数运行时间为：%.2fs' % (end_time - start_time))

    return result


@timeit
def func_0():
    time.sleep(2)


# 省略98个

@timeit
def func_99():
    time.sleep(2)


# 接下来直接调用这100个函数即可
func_0()


# ...

####################timeit 的运行原理###################
# 装饰器就是接受一个函数为参数返回另一个函数的函数
# 代码块1 = 代码块2
# 代码块1
@timeit
def func_0():
    time.sleep(2)


# 代码块2
def func_0():
    time.sleep(2)


func_0 = timeit(func_0)


#######################带参数的装饰器##########################
# 带参数的装饰器就是一个返回装饰器的函数
# 圆括号表示函数调用，而我们的程序都是从右到左执行的，所以在程序运行的时候 @ 后面的应该是 decorator 返回的装饰器。
def timeit3(out='函数运行时间为：%.2fs'):
    def decorator(func):
        def result():
            start_time = time.time()
            func()
            end_time = time.time()
            #  print('函数运行时间为：%.2fs' % (end_time - start_time))
            print(out % (end_time - start_time))

        return result

    return decorator


@timeit3('函数运行时间为：%.2fs  --来自带参数的装饰器')
def func(a):
    time.sleep(2)


func()  # => 函数运行时间为：2.00s  --来自带参数的装饰器
